Software is continually developed to provide a wide range of functionality. For example, software may be configured as applications that are developed for productivity (e.g., word processing and spreadsheets), to abstract functionality of a computing device (e.g., an operating system), to locate information (e.g., a browser), and so on. Additionally, the sophistication of this functionality is ever increasing along with the desire to gain access to this functionality as quickly as possible. For example, it may be desirable to provide increased functionality for an application between software launches to increase user satisfaction with the software.
Accordingly, techniques were developed to update applications between product launches through use of a “software update”, which is also known simply as an “update”. Updates can be configured in a variety of ways, such as to fix vulnerabilities that may be exploited by malicious parties, add later developed functionality to an application after launch, and so on. However, traditional techniques that were utilized to provide updates were inefficient and did not address a variety of different ways in which users may interact with software. Therefore, in some instances even though an update was available the limitations of traditional techniques that were available to locate and determine whether the update was available prevented utilization of the update.